#ifndef CONFIGURATION_H_
#define CONFIGURATION_H_

#include <fstream>
#include <iostream>
#include <cstring>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

using namespace std;

class Configuracion {

private:
	string path;
	string pathAdministradores;
    string pathArbol;
    string pathHashExtensible;
    string pathEntidades;
    string pathReportes;
    string pathEncriptacion;
    string pathAtaqueKasiski;

    string nombreArchivoDistrito;
    string nombreArchivoCargo;
    string nombreArchivoCandidato;
    string nombreArchivoConteo;
    string nombreArchivoLista;
    string nombreArchivoVotante;
    string nombreArchivoEleccion;
    string nombreArchivoAdministrador;
    string nombreArchivoLog;

    int tamanioDelBloque;
	int capacidadMaximaNodoHoja;
	int capacidadMaximaNodoInterno;
	int capacidadMinimaNodoHoja;
	int capacidadMinimaNodoInterno;
	int capacidadMaximaCubeta;
	int tamanioCubeta;
	int longitudClaveRSA;
    static bool banderaInstancia;
    static Configuracion *config;

    Configuracion(string path);
    void setPathAdministradores(string pathAdministradores);
    void setPathHashExtensible(string pathHash);
    void setPathArbol(string treePath);
    void setTamanioBloque(int blockSize);
    void setPathEntidades(string pathEntidades);
    void setPathReportes(string reportsFilesPath);
    void setPathEncriptado(string pathEncriptacion);
    void setPathAtaqueKasiski(string pathAtaqueKasiski);

	void setCapacidadMaximaNodoHoja(int capacidadMaximaNodoHoja);
	void setCapacidadMinimaNodoHoja(int capacidadMinimaNodoHoja);
	void setCapacidadMaximaNodoInterno(int capacidadMaximaNodoInterno);
	void setCapacidadMinimaNodoInterno(int capacidadMinimaNodoInterno);
	void setCapacidadMaximaCubeta(int capacidadMaximaCubeta);
	void setLongitudClaveRSA(int longitudClaveRSA);

   void error();

public:
    static Configuracion* getInstancia();
    static Configuracion* getInstancia(string path);
    string getPathNodosLibresArbol() const;
    string getPathEntidades() const;
    string getPathHashExtensible() const;
    string getPathArbol() const;
    int getTamanioBloque() const;
    string getPathReportes() const;
    string getPathEncriptado() const;
    string getPathAtaqueKasiski() const;
    string getPathAdministradores() const;

	int getCapacidadMaximaNodoHoja();
	int getCapacidadMinimaNodoHoja();
	int getCapacidadMaximaNodoInterno();
	int getCapacidadMinimaNodoInterno();
	int getCapacidadMaximaCubeta();
	int getLongitudClaveRSA();

    string getNombreArchivoAdministrador() const;
    string getNombreArchivoCandidato() const;
    string getNombreArchivoCargo() const;
    string getNombreArchivoConteo() const;
    string getNombreArchivoDistrito() const;
    string getNombreArchivoEleccion() const;
    string getNombreArchivoLista() const;
    string getNombreArchivoVotante() const;
    string getNombreArchivoLog() const;

    int getTamanioDelBloque() const;
    void setArchivoCargo(string archivoCargo);
    void setNombreArchivoAdministrador(string nombreArchivoAdministrador);
    void setNombreArchivoCandidato(string nombreArchivoCandidato);
    void setNombreArchivoCargo(string nombreArchivoCargo);
    void setNombreArchivoConteo(string nombreArchivoConteo);
    void setNombreArchivoDistrito(string nombreArchivoDistrito);
    void setNombreArchivoEleccion(string nombreArchivoEleccion);
    void setNombreArchivoLista(string nombreArchivoLista);
    void setNombreArchivoVotante(string nombreArchivoVotante);
    void setNombreArchivoLog(string nombreArchivoLog);
    void setTamanioDelBloque(int tamanioDelBloque);

    virtual ~Configuracion();
};

#endif /* CONFIGURATION_H_ */
